﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Controller;
using Interfaces;
using Model;
using System.Collections;


namespace GUI
{
    public partial class nyTurnering : Form
    {
        #region Attributes
        TurneringsSystem control;
        private ITurnering nuværendeTurnering = null;
        private string turneringsnavn, gruppenavn, fejlbesked = "", fornavn, efternavn, klub;
        private int antalrunder, rating, nr = 0;
        private DateTime startdato;
        private bool nyturnering = true;
        #endregion

        #region Constructor
        public nyTurnering(TurneringsSystem control, ITurnering nuværendeTurnering)
        {
            InitializeComponent();
            this.control = control;
            this.nuværendeTurnering = nuværendeTurnering;
            if (nuværendeTurnering != null)
            {
                nyturnering = false;
                control.FindTurnering(nuværendeTurnering.TurneringsID);

                txtTurneringNavn.Text = nuværendeTurnering.Turneringsnavn;
                txtGruppeNavn.Text = nuværendeTurnering.Gruppenavn;
                txtAntalRunder.Text = nuværendeTurnering.AntalRunder.ToString();
                btnStartTurnering.Size = new System.Drawing.Size(300, 32);
                btnStartTurnering.Location = new System.Drawing.Point((btnStartTurnering.Location.X - 150), 375);
                btnStartTurnering.Text = "Tilbage Til Turnering";
                btnAnnuller.Enabled = false;
                btnAnnuller.Visible = false;

                OpdaterDeltagerListe();
                DeltagerTilstand();
            }
            else
            {
                StartTilstand();
            }

        }
        #endregion

        #region Tilstande
        private void StartTilstand()
        {
            txtTurneringNavn.Enabled = true;
            txtGruppeNavn.Enabled = true;
            txtAntalRunder.Enabled = true;
            dtpStartDato.Enabled = true;
            btnVidere.Enabled = true;
            btnRediger.Enabled = false;

            txtFornavn.Enabled = false;
            txtEfternavn.Enabled = false;
            txtKlub.Enabled = false;
            txtRating.Enabled = false;
            btnTilføj.Enabled = false;
            lstDeltagere.Enabled = false;
            btnSlet.Enabled = false;
            btnSorterTilfældigt.Enabled = false;

            btnAnnuller.Enabled = true;
            btnStartTurnering.Enabled = false;

            txtTurneringNavn.Focus();
        }
        private void DeltagerTilstand()
        {
            txtTurneringNavn.Enabled = false;
            txtGruppeNavn.Enabled = false;
            txtAntalRunder.Enabled = false;
            dtpStartDato.Enabled = false;
            btnVidere.Enabled = false;
            btnRediger.Enabled = true;

            txtFornavn.Enabled = true;
            txtEfternavn.Enabled = true;
            txtKlub.Enabled = true;
            txtRating.Enabled = true;
            btnTilføj.Enabled = true;
            lstDeltagere.Enabled = true;
            btnSlet.Enabled = false;
            if (lstDeltagere.Items.Count > 1)
            {
                btnSorterTilfældigt.Enabled = true;
            }
            else
            {
                btnSorterTilfældigt.Enabled = false;
            }

            btnAnnuller.Enabled = true;
            btnStartTurnering.Enabled = true;

            txtFornavn.Text = "";
            txtEfternavn.Text = "";
            txtKlub.Text = "";
            txtRating.Text = "";
            txtFornavn.Focus();
        }
        #endregion

        #region Methods

        private void OpdaterDeltagerListe()
        {
            IDeltager deltagerdata;
            IEnumerator deltageriterator = nuværendeTurnering.GetDeltagerIterator();
            List<IDeltager> deltagerListe = new List<IDeltager>();
            int i = 1;
            
            deltageriterator.Reset();
            lstDeltagere.Items.Clear();

            // Gennemløber det hele og ligger det ind på en liste
            while (deltageriterator.MoveNext())
            {
                deltagerdata = (IDeltager)deltageriterator.Current;
                deltagerListe.Add(deltagerdata);
            }

            // Så længe i er mindre en antal deltager (kan optælles på en liste) 
            nr = deltagerListe.Count;
            while (i <= nr)
            {
                // For hver deltager på deltagerliste...
                foreach (IDeltager aktuelDeltager in deltagerListe)
                {
                    // Hvis aktueltDeltager nummer er det samme som i...
                    if (aktuelDeltager.Nr == i)
                    {
                        // Tilføjer deltager til listview...
                        ListViewItem deltager = new ListViewItem();
                        deltager.Text = aktuelDeltager.Nr.ToString();
                        deltager.SubItems.Add(aktuelDeltager.Navn.ToString() + " " + aktuelDeltager.Efternavn.ToString());
                        
                        // Tjekker om personen har rating
                        if (aktuelDeltager.Rating != 0)
                        {
                            deltager.SubItems.Add(aktuelDeltager.Rating.ToString());
                        }
                        deltager.SubItems.Add(aktuelDeltager.Klub.ToString());
                        deltager.Tag = aktuelDeltager.DeltagerID.ToString();
                        lstDeltagere.Items.Add(deltager);
                    }
                }
                i++;
            }
        }

        // Giver deltager tilfældigt nr.
        private void btnSorterTilfældigt_Click(object sender, EventArgs e)
        {
            control.SorterDeltagereTilfældigt();
            control.GemData();
            OpdaterDeltagerListe();
        }

        private void btnAnnuller_Click(object sender, EventArgs e)
        {   
            if (nuværendeTurnering != null && nyturnering == true)
            {
                control.SletTurnering(nuværendeTurnering.TurneringsID);
                control.GemData();
            }
            this.Close();
        }

        private void btnVidere_Click(object sender, EventArgs e)
        {
            fejlbesked = "";
            // Input tjek
            if (txtTurneringNavn.Text != "")
                turneringsnavn = txtTurneringNavn.Text;
            else
                fejlbesked += "Turneringens Navn skal udfyldes.\r\n";

            if (txtGruppeNavn.Text != "")
                gruppenavn = txtGruppeNavn.Text;
            else
                fejlbesked += "Gruppenavn skal udfyldes.\r\n";

            try
            {
                antalrunder = Convert.ToInt32(txtAntalRunder.Text);
                if (antalrunder < 3 || antalrunder > 9)
                {
                    fejlbesked += "Antal Runder skal være mellem 3 og 9.\r\n";
                }
            }
            catch
            {
                fejlbesked += "Antal Runder skal udfyldes og må kun være tal mellem 3 og 9.\r\n";
            }

            // Opret eller Rediger Turneringen
            if (fejlbesked != "")
            {
                MessageBox.Show(fejlbesked, "Fejl", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtTurneringNavn.Focus();
            }
            else
            {
                startdato = dtpStartDato.Value;
                if (nuværendeTurnering == null)
                {
                    // Tilføjer en Turnering
                    nuværendeTurnering = control.TilføjTurnering(turneringsnavn, gruppenavn, startdato, antalrunder);
                    if (nuværendeTurnering != null)
                    {
                        DeltagerTilstand();
                        control.GemData();
                    }
                    else
                    {
                        MessageBox.Show("Der skete en fejl. Tjek at dine data er korrekt og prøv igen");
                    }
                }
                else
                {
                    // Redigerer en Turnering
                    if (control.RedigerTurnering(turneringsnavn, gruppenavn, startdato, antalrunder) == true)
                    {
                        control.GemData();
                        DeltagerTilstand();
                    }
                    else
                    {
                        MessageBox.Show("Der skete en fejl. Tjek at dine data er korrekt og prøv igen");
                    }
                }
            }
        }

        private void btnRediger_Click(object sender, EventArgs e)
        {
            StartTilstand();
        }

        private void btnTilføj_Click(object sender, EventArgs e)
        {
            if (txtFornavn.Text != "")
            {
                    if (txtRating.Text != "")
                {
                    try
                    {
                        rating = Convert.ToInt32(txtRating.Text);
                    }
                    catch
                    {
                        MessageBox.Show("Rating skal være et tal", "Fejl", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtRating.Focus();
                        txtRating.SelectAll();
                        return;
                    }
                }
                else
                {
                    rating = 0;
                }

                fornavn = txtFornavn.Text;
                efternavn = txtEfternavn.Text;
                klub = txtKlub.Text;
                nr++;

                bool succes = control.TilføjDeltager(fornavn, efternavn, klub, nr, rating, 0);
                if (succes == false)
                {
                    MessageBox.Show("Der skete en fejl, prøv igen", "Advarsel", MessageBoxButtons.OK);
                }
                else
                {
                    // Opretter rundte for hver deltager                
                    control.TilføjRunde(1, 0, 0, 0, 0, nr);
                    OpdaterDeltagerListe();
                    DeltagerTilstand();
                }
            }
            else
            {
                MessageBox.Show("Fornavn skal udfyldes", "Fejl", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtFornavn.Focus();
            }
            control.GemData();
        }

        private void btnSlet_Click(object sender, EventArgs e)
        {
            int aktuelDeltager = Convert.ToInt32(lstDeltagere.Items[lstDeltagere.SelectedIndices[0]].Tag.ToString());
            control.FjernDeltager(aktuelDeltager);
            control.GemData();
            nr--;
            OpdaterDeltagerListe();
            DeltagerTilstand();
        }

        private void lstDeltagere_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstDeltagere.SelectedItems.Count == 1)
            {
                btnSlet.Enabled = true;
                btnSlet.Cursor = System.Windows.Forms.Cursors.Hand;
            }
            else
            {
                btnSlet.Enabled = false;
                btnSlet.Cursor = System.Windows.Forms.Cursors.Arrow;
            }
        }

        private void turnering_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)System.Windows.Forms.Keys.Enter)
            {
                btnVidere_Click(sender, e);
            }
        }

        private void deltagere_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)System.Windows.Forms.Keys.Enter)
            {
                btnTilføj_Click(sender, e);
            }
        }

        private void btnStartTurnering_Click(object sender, EventArgs e)
        {
            if (nyturnering == true)
            {
                TurneringsSkema turneringsSkemaGUI = new TurneringsSkema(control, nuværendeTurnering.TurneringsID);
                turneringsSkemaGUI.ShowDialog();
                this.Close();                               
            }
            else
            {
                this.Close();
            }

        }
        #endregion       
    }
}